<?php

class UsuariosController extends AppController {

    public $name = 'Usuarios';
    public $uses = array('Usuario', 'UsuarioPerfil', 'Perfil',);
    public $helpers = array('Html', 'Form',);
    public $components = array('Util', 'Session', 'Captcha' => array('rotate' => true,), 'RequestHandler');
    public $displayField = 'usuario';
    public $validate = array(
        'usuario' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Por favor, introduzca un Usuario'
        ),
        'contrasena' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Por favor, introduce la Contraseña'
        ),
    );
    
    public function index() {
        $this->set('listado', $this->UsuarioPerfil->find('all', array('conditions' => array('Usuario.estatus >' => 0), 'order' => array('Usuario.cedula'))));
        $this->set('estados', $this->Util->estados());
    }
    
    public function nuevo() {
        if ($this->request->is('post')) {
            $this->request->data['Usuario']['contrasena'] = $this->Util->clave($this->request->data['Usuario']['contrasena']);
            $this->request->data['Usuario']['cedula'] = $this->Util->formatocedula($this->request->data['Usuario']['cedula']);
            if ($this->Usuario->saveAssociated($this->request->data)) {
                $this->Session->setFlash('Registro Guardado', 'default', array('class' => 'success'));
                return $this->redirect(array('action' => 'index'));
            } else
                $this->Session->setFlash('Ocurri&oacute; un error, intente nuevamente', 'default', array('class' => 'error-message'));
        }
        $this->set('listadoPerfiles', $this->Perfil->find('list', array('fields' => array('Perfil.id', 'Perfil.nombre'), 'conditions' => array('Perfil.estatus >' => 0), 'order' => array('Perfil.nombre'))));
    }

    public function editar($id = null) {
        $id = $this->Util->id_decode($id);
        $data = $this->UsuarioPerfil->findByUsuarioId($id);
        
        if (!$data) {
            $this->Session->setFlash('Registro Inv&aacute;lido', 'default', array('class' => 'error-message'));
            return $this->redirect(array('action' => 'index'));
        }

        if ($this->request->data) {
            $this->Usuario->id = $id;
            $this->request->data['Usuario']['id'] = $id;
            $this->request->data['Usuario']['cedula'] = $this->Util->formatocedula($this->request->data['Usuario']['cedula']);
            $this->request->data['UsuarioPerfil']['id'] = $this->Util->id_decode($this->request->data['UsuarioPerfil']['id']);
            if ($this->Usuario->saveAssociated($this->request->data)) {
                $this->Session->setFlash('Registro Actualizado', 'default', array('class' => 'success'));
                return $this->redirect(array('action' => 'index'));
            } else
                $this->Session->setFlash('Ocurri&oacute; un error, intente nuevamente', 'default', array('class' => 'error-message'));
        } else {
            $data['Usuario']['id'] = $this->Util->id($id);
            $data['UsuarioPerfil']['id'] = $this->Util->id($data['UsuarioPerfil']['id']);
            $this->request->data = $data;
            $this->set('estados', $this->Util->estados());
            $this->set('listadoPerfiles', $this->Perfil->find('list', array('fields' => array('Perfil.id', 'Perfil.nombre'), 'conditions' => array('Perfil.estatus >' => 0), 'order' => array('Perfil.nombre'))));
        }
    }

    function eliminar($id) {
        if (!$this->request->is('post')) {
            throw new MethodNotAllowedException();
        }
        $id = $this->Util->id_decode($id);
        $this->request->data['Usuario']['id'] = $id;
        $this->request->data['Usuario']['estatus'] = 0;
        if ($this->Usuario->save($this->request->data)) {
            $this->Session->setFlash('Registro Eliminado', 'default', array('class' => 'success'));
            return $this->redirect(array('action' => 'index'));
        }
    }
    
    public function clave($id = null) {
        $id = $this->Util->id_decode($this->Session->read('usuario_id'));
        $data = $this->UsuarioPerfil->findByUsuarioId($id, array('Usuario.usuario'));
        
        if (!$data) {
            $this->Session->setFlash('Registro Inv&aacute;lido', 'default', array('class' => 'error-message'));
            return $this->redirect(array('action' => 'index'));
        }

        if ($this->request->data) {
            $this->Usuario->id = $id;
            $this->request->data['Usuario']['id'] = $id;
            $this->request->data['Usuario']['contrasena'] = $this->Util->clave($this->request->data['Usuario']['contrasena']);
            if ($this->Usuario->save($this->request->data)) {
                $this->Session->setFlash('Registro Actualizado', 'default', array('class' => 'success'));
                return $this->redirect(array('controller' => 'Pages', 'action' => 'index'));
            } else
                $this->Session->setFlash('Ocurri&oacute; un error, intente nuevamente', 'default', array('class' => 'error-message'));
        } else {
            $data['Usuario']['id'] = $this->Util->id($id);
            $this->request->data = $data;
        }
    }

    public function iniciar_sesion() {
        $this->layout = 'publico';
        extract($this->request->data);
        if ($this->request->is('ajax')) {
            $this->layout = 'ajax';
            $set_mensaje = '';
            if (empty($usuario)) {
                echo "Campo usuario vac&iacute;o";
            } else if (empty($contrasena)) {
                echo "Campo contrase&ntilde;a vac&iacute;o";
            } else {
                $usuario = strtoupper($usuario);
                $contrasena = $this->Util->clave($contrasena);
                $campos = array('Usuario.id', 'Usuario.nombre', 'Usuario.apellido', 'Usuario.cedula', 'Usuario.usuario', 'Usuario.sesion', 'Usuario.ultimo_acceso', 'Perfil.id', 'Perfil.nombre');
                $condiciones = array("Usuario.usuario" => $usuario, "Usuario.contrasena" => $contrasena, "Usuario.estatus" => 1);
                $datosUsuario = $this->UsuarioPerfil->find('first', array('fields' => $campos, 'conditions' => $condiciones));
                if (!empty($datosUsuario)) {
                    echo $this->conectar($datosUsuario);
                } else {
                    echo "Usuario y/o Contrase&ntilde;a Inv&aacute;lido, Intente Nuevamente";
                }
            }
            $this->autoRender = false;
        } else if (!empty($this->Session->read('usuario_id'))) {
            $this->redirect('../Pages');
        }
    }

    public function conectar($datosUsuario) {
        $this->Session->write('sesion_id', $this->Session->id());
        $usuario_id = $this->Util->id($datosUsuario['Usuario']['id']);
        $perfil_id = $this->Util->id($datosUsuario['Perfil']['id']);
        //$tipo_usuario = $this->Util->id($datosUsuario['Usuario']['tipo_usuario_id']);
        //$this->Session->write('tipo_usuario', $tipo_usuario);
        $this->Session->write('usuario_id', $usuario_id);
        $this->Session->write('usuario_nombre', $datosUsuario['Usuario']['nombre'] . ' ' . $datosUsuario['Usuario']['apellido']);
        $this->Session->write('usuario_cedula', $datosUsuario['Usuario']['cedula']);
        $this->Session->write('usuario', $datosUsuario['Usuario']['usuario']);
        $this->Session->write('ultimo_acceso', $datosUsuario['Usuario']['ultimo_acceso']);
        $this->Session->write('perfil_id', $perfil_id);
        $this->Session->write('perfil_nombre', $datosUsuario['Perfil']['nombre']);

        $this->request->data = null;
        $this->request->data['Usuario']['id'] = $datosUsuario['Usuario']['id'];
        $this->request->data['Usuario']['conectado'] = 1;
        $this->request->data['Usuario']['sesion'] = $this->Session->id();
        $this->request->data['Usuario']['ultimo_acceso'] = 'NOW()';

        if ($this->Usuario->save($this->request->data)) {
            /* $query = "SELECT m.id, m.padre_id, m.nombre, m.orden, mo.accion
              FROM modulos m
              INNER JOIN modulo_opcions mo ON mo.modulo_id = m.id
              INNER JOIN modulo_usuarios mu ON mu.modulo_opcion_id = mo.id
              WHERE mu.usuario_id = {$datosUsuario['Usuario']['id']} AND m.estatus = 1 AND mu.tienda_id = {$datosUsuario['Punto']['id']}
              ORDER BY m.padre_id, m.orden";
              $permisos = $this->ModuloUsuario->query($query);
              $permisoUsuario = array();
              foreach ($permisos as $valor) {
              $permisoUsuario[str_replace(' ', '_', $valor[0]['nombre'])][str_replace(' ', '_', $valor[0]['accion'])] = 1;
              }
              $this->Session->write('permiso_usuario', $permisoUsuario);

              $d = $this->CorreoPlantilla->find('first', array('conditions' => array('CorreoPlantilla.codigo' => 'ERROR_SQL')));
              $this->Session->write('dataPlantilla', $d['CorreoPlantilla']);

              $parametros = $this->Configuracion->find('all', array('conditions' => array('estatus' => 1)));
              foreach ($parametros as $datos) {
              if (!isset($_SESSION[$datos['Configuracion']['campo']])) {
              if (in_array($datos['Configuracion']['campo'], array("EMAIL_FROM_NAME", "SYSTEM_NAME_NOTIF_ERROR")))
              $this->Session->write($datos['Configuracion']['campo'], 'PUNTO DE VENTA');
              else
              $this->Session->write($datos['Configuracion']['campo'], $datos['Configuracion']['valor']);
              }
              } */
            //$this->_sesion_plana();
            return 1;
        } else {
            return 'Ocurrio un error conectando, intente nuevamente';
        }
    }

    public function cerrar_session() {
        $usuario_id = $this->Session->read('usuario_id');

        $this->Session->destroy();
        if (isset($usuario_id) && $usuario_id != null) {
            $usuario_id = $this->Util->id_decode($usuario_id);
            $qry = "UPDATE usuarios SET conectado = 0 WHERE id = $usuario_id";
            $this->Usuario->query($qry);
        }
        //$this->_vaciar_sesion_plana();
        $this->redirect("../");
        return 0;
    }
    
    public function registro() {
        $this->layout = 'publico';
        if ($this->request->is('post')) {
            $this->request->data['UsuarioPerfil']['perfil_id'] = 2;
            $this->request->data['Usuario']['contrasena'] = $this->Util->clave($this->request->data['Usuario']['contrasena']);
            if ($this->Usuario->saveAssociated($this->request->data)) {
                $this->Session->setFlash('Registro Guardado', 'default', array('class' => 'success'));
                return $this->redirect(array('action' => 'iniciar_sesion'));
            } else
                $this->Session->setFlash('Ocurri&oacute; un error, intente nuevamente', 'default', array('class' => 'error-message'));
        }
    }
    
    public function recuperar() {
        $this->layout = 'publico';
        //pr($_SESSION);
        if ($this->request->is('post')) {
            $busqueda = $this->request->data['Usuario']['usuario'];
            $campos = array('Usuario.id', 'Usuario.nombre', 'Usuario.apellido', 'Usuario.cedula', 'Usuario.usuario');
            $condiciones = array("Usuario.usuario" => $busqueda, "Usuario.correo" => $busqueda);
            $datosUsuario = $this->Usuario->find('first', array('fields' => 'Usuario.id, Usuario.correo, Usuario.nombre, Usuario.apellido, Usuario.usuario', 'conditions' => array("Usuario.estatus" => 1, array('OR' => $condiciones))));
            $this->Usuario->setCaptcha($this->Captcha->getCode());
            $this->Usuario->set($this->data);
            if(!empty($datosUsuario) && $this->Usuario->validates()) {
                $clave = $this->Util->generarClave(false);
                $datosUsuario['Usuario']['contrasena'] = $this->Util->clave($clave);
                $this->Usuario->save($datosUsuario);
                $nombre = $datosUsuario['Usuario']['nombre'];
                $nombre .= (!empty($datosUsuario['Usuario']['apellido'])) ? " {$datosUsuario['Usuario']['apellido']}" : null;
                App::uses('CakeEmail', 'Network/Email');
                $Email = new CakeEmail('sisvenla');
                $Email->to(strtolower($datosUsuario['Usuario']['correo']))
                    ->subject('SISVENLA - Recuperacion de Contraseña')
                    ->send("Usted ha solicitado el restablecimiento de su contrase&ntilde;a<br/><br/>Nombre: $nombre<br/>Usuario: {$datosUsuario['Usuario']['usuario']}<br/>Contrase&ntilde;a Nueva: $clave");
                $this->Session->setFlash('Se le ha enviado un correo', 'default', array('class' => 'success'));
                return $this->redirect(array('action' => 'iniciar_sesion'));
            } else
                $this->Session->setFlash('Usuario o Correo Inv&aacute;lido', 'default', array('class' => 'error-message'));
        }
    }
    
    public function captcha()  {
        $this->autoRender = false;
        $this->Captcha->generate();
    }

}
